/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package AccesoDatos.Persistencia.Manager;

import AccesoDatos.Persistencia.Entidad.EArea;
import LogicaNegocio.Biblioteca.Area;
import MainBiblioSoft.BiblioSoft;
import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.persistence.RollbackException;

/**
 * Esta clase en java es el gestor de persistencia
 * de objetos Area en la base de datos BiblioSoft.
 *
 * @author sebaxtian
 * Archivo: ManagerArea.java
 * @version 1.0
 * Fecha: sáb may  1 13:48:15 COT 2010
 */


public class ManagerArea {

    @PersistenceUnit
    private EntityManagerFactory managerFactory;
    private EntityManager entityManager;

    /**
     * Metodo constructor, crea un gestor para la persistencia de Area
     * 
     */
    public ManagerArea() {
        managerFactory = BiblioSoft.managerFactory;
        entityManager = managerFactory.createEntityManager();
    }

    /**
     * Metodo encargado de la persistencia en la entidad Area
     * de un objeto Area
     *
     * @param area
     */
    public void crearArea(Area area) throws RollbackException, EntityExistsException {
        entityManager.clear();
        EArea entidadArea = new EArea();
        entidadArea.setCodigoarea(area.getCodigoArea());
        entidadArea.setCodigoareapadre(area.getCodigoAreaPadre());
        entidadArea.setNombre(area.getNombre());
        entidadArea.setDescripcion(area.getDescripcion());
        //persiste el objeto en la entidad
        EntityTransaction transaccion = entityManager.getTransaction();
        try{
            transaccion.begin();
            entityManager.persist(entidadArea);
        } catch (EntityExistsException ex) {
            throw ex;
        } finally {
            transaccion.commit();
        }
        entityManager.clear();
    }

    /**
     * Este metodo actualiza un area de conocimiento de la base de datos.
     * recibe como argumento el codigo del area y la nueva area.
     *
     * @param codigoArea
     * @param area
     */
    public void actualizarArea(int codigoArea, Area area) {
        entityManager.clear();
        EArea entidadArea;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadArea = entityManager.find(EArea.class, codigoArea);
        transaccion.commit();
        if(entidadArea != null){
            entidadArea.setCodigoarea(area.getCodigoArea());
            entidadArea.setCodigoareapadre(area.getCodigoAreaPadre());
            entidadArea.setNombre(area.getNombre());
            entidadArea.setDescripcion(area.getDescripcion());
            transaccion.begin();
            entityManager.merge(entidadArea);
            transaccion.commit();
            Query consulta = entityManager.createQuery("UPDATE EAsignado e SET e.eAsignadoPK.codigoarea = :codigoareanuevo WHERE e.eAsignadoPK.codigoarea = :codigoareaanterior");
            consulta.setParameter("codigoareanuevo", area.getCodigoArea());
            consulta.setParameter("codigoareaanterior", codigoArea);
            transaccion.begin();
            consulta.executeUpdate();
            transaccion.commit();
        }
        entityManager.clear();
    }

    /**
     * Este metodo permite obtener un area de conocimiento
     * identificada con un codigo de area.
     * Si no se encuentra retorna null
     *
     * @param codigoArea
     * @return area
     */
    public Area obtenerArea(int codigoArea) {
        entityManager.clear();
        EArea entidadArea;
        Area area = null;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadArea = entityManager.find(EArea.class, codigoArea);
        transaccion.commit();
        if(entidadArea != null){
            area = new Area();
            area.setCodigoArea(entidadArea.getCodigoarea());
            area.setCodigoAreaPadre(entidadArea.getCodigoareapadre());
            area.setNombre(entidadArea.getNombre());
            area.setDescripcion(entidadArea.getDescripcion());
        }
        entityManager.clear();
        return area;
    }
    
}
